package com.gosling.cloudspace.tools;

import cn.hutool.core.collection.CollectionUtil;
import org.springframework.util.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Objects;

/**
 * 参数校验以及常用正则表达式
 *
 * @author lihonglin
 * @date 2022/3/31 14:49
 */
public class ApiParamsTool {
    /**
     * @param fieldName 属性名
     * @param object    获取值的类
     * @author lihonglin
     * @date 2022/4/15 15:58
     * @Description : 根据属性名获取属性元素，包括各种安全范围和所有父类
     */
    public static Object getFieldByClasss(String fieldName, Object object) {
        Field field = null;
        Class<?> clazz = object.getClass();
        for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
            try {
                field = clazz.getDeclaredField(fieldName);
                if (Objects.nonNull(field)) {
                    field.setAccessible(true);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            if (Objects.nonNull(field)) {
                return field.get(object);
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    /***
     * 将字符串转成ASCII数组
     * @param value
     * @return
     */
    public static int[] stringToAscii(String value) {
        if (isEmpty(value)) {
            return null;
        }
        char[] chars = value.toCharArray();
        int[] res = new int[chars.length];
        for (int i = 0; i < chars.length; i++) {
            res[i] = ((int) chars[i]);
        }
        return res;
    }

    /***
     * 将ASCII数组转成字符串
     * @param value
     * @return
     */
    public static String asciiToString(int[] value) {
        StringBuilder sbu = new StringBuilder();
        for (int aValue : value) {
            sbu.append((char) aValue);
        }
        return sbu.toString();
    }

    /**
     * 判断字符串是是否是纯数字+
     * 是 返回true
     * 不是 返回false
     *
     * @author lihonglin
     * @date 2022/4/15 16:01
     */
    public static boolean isNumeric(String str) {
        try {
            new BigDecimal(str);
        } catch (Exception e) {
            //异常 说明包含非数字。
            return false;
        }
        return true;
    }

    /**
     * 判断字符串是否为空字符串
     *
     * @param value
     * @return
     */
    public static boolean isEmpty(String value) {
        return StringUtils.isEmpty(value) || StringUtils.isEmpty(value.trim());
    }

    /***
     * 判断多个对象是否为空
     *
     * @param values
     * @return
     */
    public static boolean isEmpty(Object... values) {
        boolean rel = false;
        for (Object item : values) {
            rel = Objects.isNull(item);
        }
        return rel;
    }

    public static boolean isNotEmpty(Object value) {
        return !Objects.equals(value, null) && !Objects.equals("", value.toString().trim());
    }

    public static boolean isEmpty(Map value) {
        return CollectionUtil.isEmpty(value);
    }

    public static boolean isEmpty(String... values) {
        for (Object item : values) {
            if (StringUtils.isEmpty(item)){
                return false;
            }
        }
        return true;
    }

    public static boolean isEmpty(Map... values) {
        boolean rel = false;
        if (Objects.isNull(values)) {
            rel = true;
        }
        for (Map item : values) {
            rel = CollectionUtil.isEmpty(item);
        }
        return rel;
    }

    /**
     * 比较两个参数是否相等
     *
     * @param fValue
     * @param tValue
     * @return
     */
    public static boolean isEqual(Object fValue, Object tValue) {
        return Objects.equals(fValue, tValue);
    }

    /**
     * 判断对象是否完全为空
     *
     * @param object
     * @return
     */
    public static boolean isAllEmpty(Object object) {
        //定义返回结果，默认为true
        boolean flag = true;
        if (Objects.isNull(object)) {
            flag = true;
        } else {
            // 得到类对象
            Class clazz = object.getClass();
            // 得到所有属性
            Field fields[] = clazz.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                Object fieldValue = null;
                try {
                    //得到属性值
                    fieldValue = field.get(object);
                    //得到属性类型
                    Type fieldType = field.getGenericType();
                    // 得到属性名
                    String fieldName = field.getName();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                //只要有一个属性值不为null 就返回false 表示对象不为null
                if (fieldValue != null) {
                    flag = false;
                    break;
                }
            }
        }
        return flag;
    }

    public static boolean isNotEmpty(Object... objects) {
        return !isEmpty(objects);
    }
}
